/**
 * 
 */
package model.container;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;

import model.Cursist;
import model.Inschrijving;
import persistenty.ContainerTekstPersisteerbaar;

/**
 * This class is intended to setup the Inschrijvingen container object.
 * 
 * @author Nicolas Vanderhulst
 * @version 20111009
 * 
 */
public class Inschrijvingen extends ContainerTekstPersisteerbaar implements Comparable<Inschrijvingen>,
		Iterable<Inschrijving>, Cloneable {
	public HashSet<Inschrijving> inschrijvingen;
	private int inschrijvingsID = 0;
	Cursisten cursisten;

	AangebodenCursussen aangebodenCursussen;

	/**
	 * @return the inschrijvingsID
	 */
	public int getInschrijvingsID() {
		return inschrijvingsID;
	}

	public void setBeschikbareCursisten(Cursisten cur) {
		this.cursisten = cur;
	}

	public void setBeschikbareAangebodenCursussen(AangebodenCursussen ac) {
		this.aangebodenCursussen = ac;
	}

	/**
	 * @param inschrijvingsID
	 *            the inschrijvingsID to set
	 */
	public void setInschrijvingsID(int inschrijvingsID) {
		this.inschrijvingsID = inschrijvingsID;
	}

	public Inschrijvingen() throws InschrijvingenException {
		inschrijvingen = new HashSet<Inschrijving>();
		persistentyFiles = new ArrayList<String>();
		persistentyFiles.add("src/persitentyfiles/Inschrijving.txt");
	}

	public void add(Inschrijving c) throws CloneNotSupportedException, InschrijvingenException {
		if (c.getID() <= this.inschrijvingsID) {
			c.setID(inschrijvingsID++);
		}
		if (!inschrijvingen.add(c)) {
			throw new InschrijvingenException("Deze inschrijving bestaat reeds");
		}
		try {
			BufferedWriter writer = new BufferedWriter(new FileWriter(String.format("%s.txt", c.getClass()
					.getSimpleName()), true));
			writer.append(c.maakTekstVanObject());
			writer.close();
		} catch (IOException ioException) {
			ioException.printStackTrace();
		}
	}

	public void remove(Inschrijving c) {
		inschrijvingen.remove(c);
	}

	public boolean checkInschrijvingExists(Inschrijving a) throws CloneNotSupportedException {
		boolean b = false;
		for (Inschrijving c : inschrijvingen) {
			if (c.getID() == a.getID()) {
				b = true;
			}
		}
		return b;
	}

	public Inschrijving getInschrijvingByID(int ID) {
		Inschrijving tempInschrijving = null;
		for (Inschrijving in : this.inschrijvingen) {
			if (in.getID() == ID) {
				tempInschrijving = in;
			}
		}
		return tempInschrijving;

	}

	public String[] getInschrijvingen() {
		int i = 0;
		String[] inschrijvingenAlsString = new String[inschrijvingen.size()];
		Iterator<Inschrijving> it = inschrijvingen.iterator();
		while (it.hasNext()) {
			Inschrijving c = it.next();
			inschrijvingenAlsString[i] = Integer.toString(c.getID());
			i++;
		}
		return inschrijvingenAlsString;

	}

	@SuppressWarnings("boxing")
	public String[] getInschrijvingenByCursist(Cursist c) {
		int i = 0;
		String[] inschrijvingenAlsString = new String[inschrijvingen.size()];
		Iterator<Inschrijving> it = inschrijvingen.iterator();
		while (it.hasNext()) {
			Inschrijving in = it.next();
			if (c.getID() == in.getCursist().getID()) {
				inschrijvingenAlsString[i] = String.format(
						"ID: %s  Vak: %s  Studiepunten: %s  Plaatsen: %s   Tijdstip: %s", in.getAangebodencursus()
								.getAangebodenCursusId(), in.getAangebodencursus().getAangebodenCursus()
								.getCursusNaam(), in.getAangebodencursus().getAangebodenCursus().getStudiePunten(), in
								.getAangebodencursus().getAantalPlaatsen(), in.getAangebodencursus().getTijdsMoment()
								.toStringForListbox());
			}
			i++;
		}
		return inschrijvingenAlsString;

	}

	public int getHoogsteID() {
		int inschrNummer = -1;
		for (Inschrijving in : this.inschrijvingen) {
			if (in.getID() > inschrNummer) {
				inschrNummer = in.getID();
			}
		}
		return inschrNummer;
	}

	@Override
	public Iterator<Inschrijving> iterator() {
		return inschrijvingen.iterator();
	}

	@Override
	public int compareTo(Inschrijvingen arg0) {
		return this.toString().compareTo(arg0.toString());
	}

	@Override
	public void schrijven() throws IOException {
		try {
			BufferedWriter writer = null;
			for (Inschrijving c : inschrijvingen) {
				writer = new BufferedWriter(new FileWriter("src/persitentyfiles/Inschrijvingen.txt"));
				writer.write(c.maakTekstVanObject());
			}
			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((inschrijvingen == null) ? 0 : inschrijvingen.hashCode());
		return result;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj == null) {
			return false;
		}
		if (!(obj instanceof Inschrijvingen)) {
			return false;
		}
		Inschrijvingen other = (Inschrijvingen) obj;
		if (inschrijvingen == null) {
			if (other.inschrijvingen != null) {
				return false;
			}
		} else if (!inschrijvingen.equals(other.inschrijvingen)) {
			return false;
		}
		return true;
	}

	/**
	 * @param inschrijvingen
	 *            the inschrijvingen to set
	 */
	public void setInschrijvingen(HashSet<Inschrijving> inschrijvingen) {
		this.inschrijvingen = inschrijvingen;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Inschrijvingen [inschrijvingen=" + inschrijvingen + "]";
	}

	/**
	 * @return
	 * @see java.util.HashSet#clone()
	 */
	@SuppressWarnings("javadoc")
	@Override
	public Object clone() {
		return inschrijvingen.clone();
	}

	@Override
	public void createObject() throws CursussenException, CloneNotSupportedException, InschrijvingenException,
			LectorenException, Exception {
		try {
			Inschrijving inschrijving = null;
			if (inputFile.equalsIgnoreCase("Inschrijving.txt")) {
				inschrijving = new Inschrijving();
			}
			if (inschrijving != null) {
				inschrijving = inschrijving.maakObjectVanTekst(objectAlsTekst);
				inschrijving.invullenCursistVanTekst(objectAlsTekst, cursisten);
				inschrijving.invullenAangebodenCursusVanTekst(objectAlsTekst, aangebodenCursussen);
				inschrijvingen.add(inschrijving);
				inschrijvingsID = (inschrijvingsID < inschrijving.getID() ? inschrijving.getID() : inschrijvingsID);// Update
																													// hoogste
																													// huidige
																													// evenementid
			}
		} catch (NumberFormatException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
